/**
 * 节流函数
 */
export const throttle = (fn, interval, options = {
  begin: true, // 开始是否执行一次
  end: false // 结束是否执行一次
}) => {
  // 记录上一次的开始时间
  let firstTime = 0;
  return function(...args) {
    // 获取当前事件触发时间
    const nowTime = new Date().getTime();
    // 判断开始是否执行一次,如果不需要执行,在remainTime获取前将firstTime置为当前时间
    if (!firstTime && !options.begin) firstTime = nowTime;
    // 获取剩余时间
    const remainTime = interval - (nowTime - firstTime);
    if (remainTime <= 0) {
      fn.apply(this, args);
      // 保存上一次触发时间
      firstTime = nowTime;
    }
  }
}

/**
 * 防抖函数
 */
export const debounce = (fn, delay, immediate = false) => {
  // 记录是否有定时器
  let timer = null;
  // 是否立即执行一次
  let isRightnow = false;
  return function(...args) {
    // 取消上一次定时器
    if (timer) clearTimeout(timer);
    // 立即执行一次函数
    if (immediate && !isRightnow) {
      fn.apply(this, args);
      isRightnow = true
    } else {
      timer = setTimeout(() => {
        fn.apply(this, args);
        isRightnow = false;
        // 重置为null避免内存泄漏
        timer = null;
      }, delay);
    }
  }
}

/**
 * 将imgURL转为base64格式
 */
export const imageToBase64 = img => {
  let canvas = document.createElement("canvas");
  canvas.width = img.width;
  canvas.height = img.height;
  let ctx = canvas.getContext("2d");
  ctx.drawImage(img, 0, 0, img.width, img.height);
  let ext = img.src.substring(img.src.lastIndexOf(".") + 1).toLowerCase();
  let dataURL = canvas.toDataURL("image/jpeg" + ext);
  return dataURL;
};

/**
 * 判断类型
 */
export const checkoutType = target => {
  // 调用对象原型上的方法toString,利用call将this指向改变,得到[xxx Xxx]最后使用slice截取字符串(例如: [object Object] ==> Object)
  return Object.prototype.toString.call(target).slice(8, -1)
}

/**
 * 生成随机范围数
 */
export const randam = (min, max) => {
  if (min >= 0 && max >= 0) {
    return Math.floor(min + Math.random() * ((max + 1) - min));
  }
  return null;
}

/**
 * 生成随机标识
 */
export const uuid = () => {
  const s = [];
  const hexDigits = '0123456789abcdef';
  for (let i = 0; i < 36; i++) {
    s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
  }
  s[14] = '4'; // bits 12-15 of the time_hi_and_version field to 0010
  s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01
  s[8] = s[13] = s[18] = s[23] = '-';

  const uuid = s.join('');
  return uuid;
}